const Router = require("koa-router");
const { getDB } = require("../mongo");
const router = new Router();
const { ObjectId } = require("mongodb");
const deleteOldData = require("./deleteOldData");
const axiosServerTest = require("./axiosServerTest");

router.get("/getBaseInfo", async (ctx, res) => {
  try {
    const db = getDB();
    const collection = db.collection("baseInfo"); // 使用指定集合
    let data;

    data = await collection.find().toArray();

    ctx.body = {
      code: 200,
      data,
    };
  } catch (err) {
    ctx.status = 500;
    ctx.body = {
      code: 500,
      message: err.message,
    };
  }
});

router.get("/getAllTracingList", async (ctx) => {
  // 检查前端传递的开始和结束时间戳
  const startTime = ctx.query.startTime
    ? parseInt(ctx.query.startTime, 10)
    : null;
  const endTime = ctx.query.endTime ? parseInt(ctx.query.endTime, 10) : null;
  // 多条件查询
  const query = {
    $and: [
      // 事件类型 server请求出错，code代码出错，reject Promise错误，console.error 打印报错
      ctx.query.eventId ? { eventId: ctx.query.eventId } : {},
      // 日期查询
      startTime && endTime
        ? {
            triggerTime: {
              $gte: startTime,
              $lte: endTime,
            },
          }
        : {},
      // 错误发生的URL，包含传递的参数即可
      ctx.query.triggerPageUrl
        ? {
            triggerPageUrl: { $regex: ctx.query.triggerPageUrl, $options: "i" },
          }
        : {},
      ctx.query.eventType ? { eventType: ctx.query.eventType } : {},
      // 接口地址查询
      ctx.query.requestUrl
        ? {
            requestUrl: { $regex: ctx.query.requestUrl, $options: "i" },
          }
        : {},
    ].filter((condition) => Object.keys(condition).length !== 0), // 过滤掉空条件
  };

  // 分页参数
  const pageNum = parseInt(ctx.query.pageNum, 10) || 1;
  const pageSize = parseInt(ctx.query.pageSize, 10) || 10;
  const skip = (pageNum - 1) * pageSize;

  try {
    const db = getDB();
    const collection = db.collection("tracingList"); // 使用指定集合
    // 计算总数
    const totalCount = await collection.countDocuments(query);
    // 分页查询
    const data = await collection
      .find(query)
      .sort({ triggerTime: -1 }) // 按triggerTime降序排列
      .skip(skip)
      .limit(pageSize)
      .toArray();

    ctx.body = {
      code: 200,
      data: {
        items: data,
        total: totalCount,
        pageNum,
        pageSize,
      },
    };
  } catch (err) {
    ctx.status = 500;
    ctx.body = {
      code: 500,
      message: err.message,
    };
  }
});

router.post("/trackweb", async (ctx) => {
  try {
    const db = getDB();
    const tracingList = db.collection("tracingList");
    // 发生错误时上报的信息
    let infoList = ctx.request.body.eventInfo;
    // 操作用户的基本信息
    let baseInfo = ctx.request.body.baseInfo;

    if (infoList) {
      infoList = infoList
        .map((item) => {
          return {
            ...item,
            ip: baseInfo.ip,
          };
        })
        .filter((i) => i.errMessage);
      // 插入一个数组格式的数据到MongoDB
      if (infoList.length > 0) {
        // 插入一个数组格式的数据到MongoDB
        await tracingList.insertMany(infoList);
      }
    }

    // // 保存基本信息
    // const baseInfoCollection = db.collection("baseInfo");
    // const { ip, sdkUserUuid } = baseInfo;
    // // 保存基本信息
    // const existingRecord = await baseInfoCollection.findOne({
    //   ip,
    //   sdkUserUuid,
    // });

    // if (existingRecord) {
    //   // 如果记录存在则更新
    //   await baseInfoCollection.updateOne(
    //     { ip, sdkUserUuid },
    //     { $set: baseInfo }
    //   );
    // } else {
    //   // 如果记录不存在则新增
    //   await baseInfoCollection.insertOne(baseInfo);
    // }

    ctx.body = {
      code: 200,
      message: "上报成功！",
    };
  } catch (err) {
    console.log(err, "66");
    ctx.status = 500;
    ctx.body = {
      code: 500,
      message: "上报失败！",
      err,
    };
  }
});

// 图片上传的方式
router.get("/trackweb", async (ctx) => {
  try {
    const db = getDB();
    const tracingList = db.collection("tracingList");
    // 发生错误时上报的信息
    let infoList = ctx.request.body.eventInfo;
    // 操作用户的基本信息
    let baseInfo = ctx.request.body.baseInfo;

    if (infoList) {
      infoList = infoList
        .map((item) => {
          return {
            ...item,
            ip: baseInfo.ip,
          };
        })
        .filter((i) => i.errMessage);

      if (infoList.length > 0) {
        // 插入一个数组格式的数据到MongoDB
        await tracingList.insertMany(infoList);
      }
    }

    // // 保存基本信息
    // const baseInfoCollection = db.collection("baseInfo");
    // const { ip, sdkUserUuid } = baseInfo;
    // // 保存基本信息
    // const existingRecord = await baseInfoCollection.findOne({
    //   ip,
    //   sdkUserUuid,
    // });

    // if (existingRecord) {
    //   // 如果记录存在则更新
    //   await baseInfoCollection.updateOne(
    //     { ip, sdkUserUuid },
    //     { $set: baseInfo }
    //   );
    // } else {
    //   // 如果记录不存在则新增
    //   await baseInfoCollection.insertOne(baseInfo);
    // }

    ctx.body = {
      code: 200,
      message: "上报成功！",
    };
  } catch (err) {
    console.log(err, "66");
    ctx.status = 500;
    ctx.body = {
      code: 500,
      message: "上报失败！",
      err,
    };
  }
});

// 获取不同错误的总数
router.get("/getCount", async (ctx) => {
  // 检查前端传递的开始和结束时间戳
  const startTime = ctx.query.startTime
    ? parseInt(ctx.query.startTime, 10)
    : null;
  const endTime = ctx.query.endTime ? parseInt(ctx.query.endTime, 10) : null;
  // 根据时间段获取错误数量
  let query = {
    $and: [
      // 查询时间范围内的数据
      startTime && endTime
        ? {
            triggerTime: {
              $gte: startTime,
              $lte: endTime,
            },
          }
        : {},
      // 数据类型
      ctx.query.eventId ? { eventId: ctx.query.eventId } : {},
    ],
  };
  try {
    const db = getDB();
    const collection = db.collection("tracingList");
    const totalCount = await collection.countDocuments(query);
    ctx.body = {
      code: 200,
      data: {
        total: totalCount,
      },
    };
  } catch (err) {
    ctx.status = 500;
    ctx.body = {
      code: 500,
      message: err.message,
    };
  }
});

// 根据ID删除错误
router.post("/deleteError", async (ctx) => {
  try {
    const db = getDB();
    const collection = db.collection("tracingList");
    const { id } = ctx.request.body;
    await collection.deleteOne({ _id: new ObjectId(id) });
    ctx.body = {
      code: 200,
      message: "删除成功！",
    };
  } catch (err) {
    ctx.status = 500;
    ctx.body = {
      code: 500,
      message: err.message,
    };
  }
});

// 批量删除
router.post("/deleteErrors", async (ctx) => {
  try {
    const db = getDB();
    const collection = db.collection("tracingList");
    const { ids } = ctx.request.body;
    await collection.deleteMany({
      _id: { $in: ids.map((id) => new ObjectId(id)) },
    });
    ctx.body = {
      code: 200,
      message: "删除成功！",
    };
  } catch (err) {
    ctx.status = 500;
    ctx.body = {
      code: 500,
      message: err.message,
    };
  }
});

// 根据triggerTime判断创建日期是否已经超过30天，删除30天前的数据
router.post("/deleteOldData", async (ctx) => {
  try {
    await deleteOldData();
    ctx.body = {
      code: 200,
      message: "删除成功！",
    };
  } catch (err) {
    ctx.status = 500;
    ctx.body = {
      code: 500,
      message: err.message,
    };
  }
});

module.exports = [
  axiosServerTest,
  router
];
